/**
 * 浏览时长记录工具类
 * 实现分段计时和自动上传机制，防止非正常退出导致的数据丢失
 */
import { addBrowseHistory, updateBrowseHistory, upsertBrowseHistory, getTodayBrowseHistory } from '@/api/browseHistory'
import { getToken } from '@/utils/auth'

class BrowseTracker {
  constructor() {
    this.isTracking = false
    this.startTime = null
    this.currentBrowseId = null
    this.totalDuration = 0
    this.lastUploadTime = null
    this.uploadInterval = 1000 // 1秒上传一次
    this.timer = null
    this.pageInfo = null
    this.userId = null
  }

  /**
   * 开始记录浏览时长
   * @param {Object} pageInfo 页面信息
   * @param {String} pageInfo.type 页面类型 (product/comment/order)
   * @param {Number} pageInfo.productId 商品ID
   * @param {String} pageInfo.productName 商品名称
   * @param {String} pageInfo.productImage 商品图片
   * @param {Number} pageInfo.productPrice 商品价格
   * @param {Number} userId 用户ID
   */
  async startTracking(pageInfo, userId) {
    try {
      console.log('=== 浏览时长记录启动 ===')
      console.log('页面信息:', pageInfo)
      console.log('用户ID:', userId)
      
      // 检查用户是否登录
      const token = getToken()
      console.log('用户Token:', token ? '已获取' : '未获取')
      
      if (!token || !userId) {
        console.log('❌ 用户未登录，无法记录浏览时长')
        return
      }

      // 如果已经在记录，先停止之前的记录
      if (this.isTracking) {
        console.log('⚠️ 已有记录在进行，先停止之前的记录')
        await this.stopTracking()
      }

      this.isTracking = true
      this.startTime = new Date()
      this.lastUploadTime = new Date()
      this.pageInfo = pageInfo
      this.userId = userId

      // 检查今日是否已有该商品的浏览记录
      await this.checkTodayBrowseRecord()

      console.log('✅ 浏览时长记录初始化完成')
      console.log('开始时间:', this.startTime)
      console.log('初始浏览时长:', this.totalDuration, '秒')
      console.log('上传间隔:', this.uploadInterval, 'ms')

      // 创建或更新浏览记录
      await this.createInitialRecord()

      // 启动定时上传
      this.startPeriodicUpload()
      console.log('✅ 定时上传已启动')

    } catch (error) {
      console.error('❌ 开始记录浏览时长失败:', error)
    }
  }

  /**
   * 停止记录浏览时长
   */
  async stopTracking() {
    if (!this.isTracking) {
      return
    }

    try {
      // 停止定时器
      if (this.timer) {
        clearInterval(this.timer)
        this.timer = null
      }

      // 计算最终浏览时长
      const endTime = new Date()
      const sessionDuration = Math.floor((endTime - this.lastUploadTime) / 1000)

      // 最后一次上传数据
      if (this.currentBrowseId && sessionDuration > 0) {
        await this.uploadBrowseData()
      }

      console.log('停止记录浏览时长，最终累计时长:', this.totalDuration, '秒')

      // 重置状态
      this.reset()

    } catch (error) {
      console.error('停止记录浏览时长失败:', error)
      this.reset()
    }
  }

  /**
   * 检查今日是否已有该商品的浏览记录
   */
  async checkTodayBrowseRecord() {
    try {
      console.log('=== 检查今日浏览记录 ===')
      console.log('用户ID:', this.userId, '商品ID:', this.pageInfo.productId)
      
      // 确保商品ID存在
      if (!this.pageInfo.productId) {
        console.log('⚠️ 商品ID为空，从0开始计时')
        this.totalDuration = 0
        this.currentBrowseId = null
        return
      }
      
      const response = await getTodayBrowseHistory(this.userId, this.pageInfo.productId)
      console.log('今日浏览记录查询响应:', response)
      
      if (response.code === 200 && response.data && response.data !== null) {
        // 如果今日已有浏览记录，获取已有的浏览时长作为初始值
        const existingDuration = parseInt(response.data.browseDuration) || 0
        const existingBrowseId = response.data.browseId || response.data.id
        
        this.totalDuration = existingDuration
        this.currentBrowseId = existingBrowseId
        console.log('✅ 发现今日浏览记录，初始时长:', this.totalDuration, '秒，记录ID:', this.currentBrowseId)
      } else {
        // 如果今日没有浏览记录，从0开始
        this.totalDuration = 0
        this.currentBrowseId = null
        console.log('✅ 今日首次浏览该商品，从0开始计时')
      }
    } catch (error) {
      console.error('❌ 检查今日浏览记录异常:', error)
      // 出错时从0开始
      this.totalDuration = 0
      this.currentBrowseId = null
    }
  }

  /**
   * 创建初始浏览记录
   */
  async createInitialRecord() {
    try {
      // 如果已有今日记录，则跳过创建步骤
      if (this.currentBrowseId) {
        console.log('=== 已有今日浏览记录，跳过创建步骤 ===')
        console.log('现有记录ID:', this.currentBrowseId, '初始时长:', this.totalDuration, '秒')
        return
      }
      
      console.log('=== 开始创建初始浏览记录 ===')
      console.log('用户ID:', this.userId)
      console.log('页面信息:', this.pageInfo)
      
      const browseData = {
        userId: this.userId,
        productId: this.pageInfo.productId,
        productName: this.pageInfo.productName || '未知商品',
        productImage: this.pageInfo.productImage || '',
        productPrice: this.pageInfo.productPrice || 0,
        browseTime: this.startTime.toISOString().slice(0, 19).replace('T', ' '),
        browseDuration: 0,
        deviceType: this.getDeviceType(),
        ipAddress: await this.getClientIP()
      }
      
      console.log('准备发送的浏览数据:', browseData)

      const response = await upsertBrowseHistory(browseData)
      console.log('创建初始记录API响应:', response)
      
      if (response.code === 200) {
        this.currentBrowseId = response.data
        console.log('✅ 创建初始浏览记录成功，ID:', this.currentBrowseId)
      } else {
        console.error('❌ 创建初始浏览记录失败:', response.msg)
      }
    } catch (error) {
      console.error('❌ 创建初始浏览记录异常:', error)
    }
  }

  /**
   * 启动定时上传
   */
  startPeriodicUpload() {
    console.log('=== 启动定时上传，间隔:', this.uploadInterval, 'ms ===')
    this.timer = setInterval(async () => {
      if (this.isTracking) {
        console.log('⏰ 定时器触发，开始上传浏览数据')
        await this.uploadBrowseData()
      } else {
        console.log('⚠️ 记录已停止，跳过本次上传')
      }
    }, this.uploadInterval)
  }

  /**
   * 上传浏览数据
   */
  async uploadBrowseData() {
    try {
      console.log('=== 开始上传浏览数据 ===')
      const currentTime = new Date()
      const sessionDuration = Math.floor((currentTime - this.lastUploadTime) / 1000)
      this.lastUploadTime = currentTime
      
      console.log('本次会话时长:', sessionDuration, '秒')
      console.log('当前累计浏览时长:', this.totalDuration, '秒')

      if (sessionDuration > 0) {
        const browseData = {
          userId: this.userId,
          productId: this.pageInfo.productId,
          productName: this.pageInfo.productName || '未知商品',
          productImage: this.pageInfo.productImage || '',
          productPrice: this.pageInfo.productPrice || 0,
          browseTime: currentTime.getFullYear() + '-' + 
            String(currentTime.getMonth() + 1).padStart(2, '0') + '-' + 
            String(currentTime.getDate()).padStart(2, '0') + ' ' + 
            String(currentTime.getHours()).padStart(2, '0') + ':' + 
            String(currentTime.getMinutes()).padStart(2, '0') + ':' + 
            String(currentTime.getSeconds()).padStart(2, '0'),
          browseDuration: sessionDuration, // 只发送本次会话的时长，让后端累加
          deviceType: this.getDeviceType(),
          ipAddress: await this.getClientIP()
        }
        
        // 如果已有记录ID，则添加到数据中用于更新
        if (this.currentBrowseId) {
          browseData.browseId = this.currentBrowseId
        }
        
        console.log('准备更新的浏览数据:', browseData)
        const response = await upsertBrowseHistory(browseData)
        console.log('更新浏览数据API响应:', response)
        
        if (response.code === 200) {
          // 如果之前没有记录ID，现在获取新创建的记录ID
          if (!this.currentBrowseId && response.data) {
            this.currentBrowseId = response.data
          }
          // 更新本地累计时长
          this.totalDuration += sessionDuration
          console.log('✅ 更新浏览数据成功，本次上传时长:', sessionDuration, '秒，累计时长:', this.totalDuration, '秒，记录ID:', this.currentBrowseId)
        } else {
          console.error('❌ 更新浏览数据失败:', response.msg)
        }
      } else {
        console.log('⚠️ 本次会话时长为0，跳过上传')
      }
    } catch (error) {
      console.error('❌ 上传浏览数据异常:', error)
    }
  }

  /**
   * 获取设备类型
   */
  getDeviceType() {
    // 在uni-app中判断设备类型
    const systemInfo = uni.getSystemInfoSync()
    return systemInfo.platform || 'unknown'
  }

  /**
   * 获取客户端IP（模拟）
   */
  async getClientIP() {
    // 在实际应用中，可能需要调用API获取真实IP
    // 这里返回一个模拟IP
    return '192.168.1.100'
  }

  /**
   * 重置状态
   */
  reset() {
    this.isTracking = false
    this.startTime = null
    this.currentBrowseId = null
    this.totalDuration = 0
    this.lastUploadTime = null
    this.pageInfo = null
    this.userId = null
    if (this.timer) {
      clearInterval(this.timer)
      this.timer = null
    }
  }

  /**
   * 暂停记录（页面失去焦点时）
   */
  pause() {
    if (this.isTracking && this.timer) {
      clearInterval(this.timer)
      this.timer = null
      console.log('暂停浏览时长记录')
    }
  }

  /**
   * 恢复记录（页面获得焦点时）
   */
  resume() {
    if (this.isTracking && !this.timer) {
      this.lastUploadTime = new Date()
      this.startPeriodicUpload()
      console.log('恢复浏览时长记录')
    }
  }

  /**
   * 获取当前浏览时长
   */
  getCurrentDuration() {
    if (!this.isTracking) {
      return 0
    }
    const currentTime = new Date()
    const sessionDuration = Math.floor((currentTime - this.lastUploadTime) / 1000)
    return this.totalDuration + sessionDuration
  }
}

// 创建全局实例
const browseTracker = new BrowseTracker()

export default browseTracker